﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Model
{
    public class ÅrsregnskabsColl
    {
        // attribut
        private List<Årsregnskab> årsregnskaber;

        // konstruktør
        public ÅrsregnskabsColl()
        {
            årsregnskaber = new List<Årsregnskab>();
        }

        #region Operationer på årsregnskabs-objekter

        #region Metoder til at oprette, redigere, finde og returnere iterator 

        // metode til at oprette et årsregnskabs-objekt
        public void OpretÅrsregnskab(int årstal)
        {
            Årsregnskab årsregnskab = new Årsregnskab(årstal);
            årsregnskaber.Add(årsregnskab);
        }

        // Metode til at finde et årsregnskabs-objekt
        public Årsregnskab FindÅrsregnskab(int årstal)
        {
            foreach (Årsregnskab år in årsregnskaber)
            {
                if (årstal == år.Årstal)
                {
                    return år;
                }
            }
            return null;
        }

        // Metode til at redigere et årsregnskabs-objekt
        public void RedigerÅrsregnskab(int årstal, double immaterielle, double materielle, double finansielle, double varebeholdninger,
            double tilgodehavender, double værdipapirer, double likvideBeholdninger, double aktiekapital, double overførteOverskud,
            double forslagTilUdbytte, double hensatteForpligtelser, double langfristetGæld, double kortfristetGæld)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            år.Immaterielle = immaterielle;
            år.Materielle = materielle;
            år.Finansielle = finansielle;
            år.Varebeholdninger = varebeholdninger;
            år.Tilgodehavender = tilgodehavender;
            år.Værdipapirer = værdipapirer;
            år.LikvideBeholdninger = likvideBeholdninger;
            år.Aktiekapital = aktiekapital;
            år.OverførteOverskud = overførteOverskud;
            år.ForslagTilUdbytte = forslagTilUdbytte;
            år.HensatteForpligtelser = hensatteForpligtelser;
            år.LangfristetGæld = langfristetGæld;
            år.KortfristetGæld = kortfristetGæld;
        }

        // metode til at returnere iterator, der gennemløber årsregnskabs-objekterne
        public IEnumerator GetÅrsregnskaber()
        {
            return årsregnskaber.GetEnumerator();
        }

        #endregion

        #region Metoder til at sammenligne nøgletal

        // metode til at sætte sætte et år som indekstal
        public int SætÅrSomIndeks()
        {
            int indekstal = 100;
            return indekstal;
        }

        // metode til at udregne indekstal på omsætning
        public double GetIndekstalOmsætning(int årstal, int årstalBasisår)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            Årsregnskab basisår = FindÅrsregnskab(årstalBasisår);
            double årsOmsætning = år.GetNettoomsætning();
            double basisårsOmsætning = basisår.GetNettoomsætning();

            double indekstal = (årsOmsætning * 100) / basisårsOmsætning;
            return indekstal;
        }

        // metode til at udregne indekstal på produktionsomkostninger
        public double GetIndekstalProduktionsomkostninger(int årstal, int årstalBasisår)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            Årsregnskab basisår = FindÅrsregnskab(årstalBasisår);
            double årsProduktionsomkostninger = år.GetProduktionsomkostninger();
            double basisårsProduktionsomkostninger = basisår.GetProduktionsomkostninger();

            double indekstal = (årsProduktionsomkostninger * 100) / basisårsProduktionsomkostninger;
            return indekstal;
        }

        // metode til at udregne indekstal på distributionsomkostninger
        public double GetIndekstalDistributionsomkostninger(int årstal, int årstalBasisår)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            Årsregnskab basisår = FindÅrsregnskab(årstalBasisår);
            double årsDistributionsomkostninger = år.GetDistributionsomkostning();
            double basisårsDistributionsomkostninger = basisår.GetDistributionsomkostning();

            double indekstal = (årsDistributionsomkostninger * 100) / basisårsDistributionsomkostninger;
            return indekstal;
        }

        // metode til at udregne indekstal på administrationsomkostninger
        public double GetIndekstalAdministrationsomkostninger(int årstal, int årstalBasisår)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            Årsregnskab basisår = FindÅrsregnskab(årstalBasisår);
            double årsAdministrationsomkostninger = år.GetAdministrationsomkostning();
            double basisårsAdministrationsomkostninger = basisår.GetAdministrationsomkostning();

            double indekstal = (årsAdministrationsomkostninger * 100) / basisårsAdministrationsomkostninger;
            return indekstal;
        }

        #endregion

        #region Kald af associerings metoder

        // kald af metode til at skabe associeringen mellem et årsregnskabs-objekt og et posterings-objekt
        public void TilknytPostering(int årstal, Postering enPostering)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            år.TilknytPostering(enPostering);
        }

        // kald af metode til at fjerne associeringen mellem et årsregnskabs-objekt og et posterings-objekt
        public void FjernPosteringsTilknytning(int årstal, Postering enPostering)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            år.FjernPosteringsTilknytning(enPostering);
        }

        // kald af metode til at hente listen med associerede posterings-objekter
        public IEnumerator GetMinePosteringer(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetMinePosteringer();
        }

        #endregion

        #region Kald af metoder til at udregne og returnere de forskellige værdier i resultatopgørelsen

        // kald af metode til at returnere nettoomsætningen
        public double GetNettoomsætning(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetNettoomsætning();
        }

        // kald af metode til at returnere produktionsomkostninger
        public double GetProduktionsomkostninger(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetProduktionsomkostninger();
        }

        // kald af metode til at returnere bruttoresultatet
        public double GetBruttoresultat(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetBruttoresultat();
        }

        // kald af metode til at returnere distributionsomkostning
        public double GetDistributionsomkostning(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetDistributionsomkostning();
        }

        // kald af metode til at returnere administrationsomkostning
        public double GetAdministrationsomkostning(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetAdministrationsomkostning();
        }

        // kald af metode til at returnere resultatet af primær drift
        public double GetResultatPrimærDrift(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetResultatPrimærDrift();
        }

        // kald af metode til at returnere den finansielle omkostning netto
        public double GetFinansielOmkostningNetto(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetFinansielOmkostningNetto();
        }

        // kald af metode til at returnere årets resultat
        public double GetÅretsResultat(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetÅretsResultat();
        }

        #endregion

        #region Kald af metoder til at udregne og returnere de resterende værdier i balancen

        // kald af metode til at returnere beløbet for de samlede anlægsaktiver
        public double GetAnlægsaktiver(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetAnlægsaktiver();
        }

        // kald af metode til at returnere beløbet for de samlede omsætningsaktiver
        public double GetOmsætningsaktiver(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetOmsætningsaktiver();
        }

        // kald af metode til at returnere beløbet for de samlede aktiver
        public double GetAktiverIAlt(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetAktiverIAlt();
        }

        // kald af metode til at returnere beløbet for den samlede egenkapital
        public double GetEgenkapital(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetEgenkapital();
        }

        // kald af metode til at returnere beløbet for de samlede gældsforpligtelser
        public double GetGældsforpligtelser(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetGældsforpligtelser();
        }

        // kald af metode til at returnere beløbet for de samlede passiver
        public double GetPassiverIAlt(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetPassiverIAlt();
        }

        #endregion

        #region Kald af metoder til at udregne og returnere nøgletallene til rentabilitetsanalysen

        // kald af metode til at returnere afkastningsgraden
        public double GetAfkastningsgrad(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetAfkastningsgrad();
        }

        // kald af metode til at returnere overskudsgraden
        public double GetOverskudsgrad(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetOverskudsgrad();
        }

        // kald af metode til at returnere aktivernes omsætningshastighed
        public double GetAktivernesOmsætningshastighed(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetAktivernesOmsætningshastighed();
        }

        // kald af metode til at returnere egenkapitalens forretning
        public double GetEgenkapitalensForretning(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetEgenkapitalensForretning();
        }

        // kald af metode til at returnere fremmedkapitalens forretning
        public double GetFremmedkapitalensForretning(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetFremmedkapitalensForretning();
        }

        #endregion

        #region Kald af metoder til at udregne og returnere nøgletallene til analysen af indtjeningsevnen

        // kald af metode til at returnere dækningsgraden
        public double GetDækningsgrad(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetDækningsgrad();
        }

        // kald af metode til at returnere nulpunktsomsætningen
        public double GetNulpunktsomsætning(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetNulpunktsomsætning();
        }

        // kald af metode til at returnere sikkerhedsmarginen
        public double GetSikkerhedsMargin(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetSikkerhedsMargin();
        }

        // kald af metode til at returnere nulpunktsomsætningen
        public double GetKapacitetsgrad(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetKapacitetsgrad();
        }

        #endregion

        #region Kald af metoder til at udregne og returnere nøgletallene til analysen af kapitaltilpasningen

        // kald af metode til at returnere anlægsaktivernes omsætningshastighed
        public double GetAnlægsaktivernesOmsætningshastighed(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetAnlægsaktivernesOmsætningshastighed();
        }

        // kald af metode til at returnere den materielle omsætningshastighed
        public double GetMaterielleOmsætningshastighed(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetMaterielleOmsætningshastighed();
        }

        // kald af metode til at returnere varelagerets omsætningshastighed
        public double GetVarelagrenesOmsætningshastighed(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetVarelagrenesOmsætningshastighed();
        }

        // kald af metode til at returnere lagerdage
        public double GetLagerdage(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetLagerdage();
        }

        // kald af metode til at returnere varedebitorernes omsætningshastighed
        public double GetVaredebitorernesOmsætningshastighed(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetVaredebitorernesOmsætningshastighed();
        }

        // kald af metode til at returnere kreditdage
        public double GetKreditdage(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetKreditdage();
        }

        #endregion

        #region Kald af metoder til at udregne og returnere nøgletallene til analysen af soliditet og likviditet

        // kald af metode til at returnere soliditetsgraden
        public double GetSoliditetsgrad(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetSoliditetsgrad();
        }

        // kald af metode til at returnere likviditetsgrad 1
        public double GetLikviditetsgrad1(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetLikviditetsgrad1();
        }

        // kald af metode til at returnere likviditetsgrad 2
        public double GetLikviditetsgrad2(int årstal)
        {
            Årsregnskab år = FindÅrsregnskab(årstal);
            return år.GetLikviditetsgrad2();
        }

        #endregion

        #endregion
    }
}
